package pool;

import java.util.concurrent.LinkedBlockingDeque;
import java.util.concurrent.LinkedBlockingQueue;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;

public class Demo01 {
    public static void main(String[] args) {
//        自定义线程池

//        最大线程到底该如何定义
//        1、CPU 密集型，几核，就是几，可以保持CPU的效率最高
//        2、IO 密集型 判断你程序中十分耗IO的线程有多少个
//        程序 15个大型任务，io十分占用资源
//        获取CPU的核数
        System.out.println(Runtime.getRuntime().availableProcessors());//获取电脑是几核的

        ThreadPoolExecutor threadPoolExecutor = new ThreadPoolExecutor(
                2,//核心线程池
                5,//最大线程池大小
                3,//超过多长时间就会关闭最大线程池，也是释放线程池
                TimeUnit.SECONDS,//超时时间
                new LinkedBlockingDeque<>(3),//阻塞队列大小也就是候客区大小
                new ThreadPoolExecutor.AbortPolicy()//拒绝策略，
        );
        try {
//            最大承载：Deque+Max
            for (int i = 1; i <= 9; i++) {
                threadPoolExecutor.execute(() -> {
                    System.out.println(Thread.currentThread().getName() + "ok");
                });
            }
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            threadPoolExecutor.shutdown();
        }
    }
}
/*
解析：循环5的时候：核心线程是2，候客区是3，所以刚好用不到后面的，这里只有两个人处理，还没有触发到后面的3个
pool-1-thread-1ok
pool-1-thread-1ok
pool-1-thread-1ok
pool-1-thread-1ok
pool-1-thread-2ok
解析：循环是6的时候，候客区满了，就触发了第三号
pool-1-thread-1ok
pool-1-thread-1ok
pool-1-thread-1ok
pool-1-thread-2ok
pool-1-thread-1ok
pool-1-thread-3ok
解析：循环是9的时候，抛出ThreadPoolExecutor异常，因为人数9超过了候客区（阻塞队列）+最大核心线程数=8；
 */